﻿#define _CRT_SECURE_NO_WARNINGS
// ↑ 将本行在代码放在第一行可以避免 scanf的报错问题（仅在VS编译器里）
//【初识篇】21.define 定义常量
//【初识篇】22.休息
//【初识篇】23.指针   【非常重要】
//【初识篇】24.结构体

#include<stdio.h>

	//21.define 定义标识符常量；
#define num 100
	//21.define 定义宏；
#define add(x,y) ((x)+(y))
//		宏名（ 宏的参数）  (宏体)


//24.结构体
struct Per
{
	//下面都是结构体里的成员
	char name[20];
	int age;
	char sex[10];
	char tele[12];
};


//23+24,利用指针打印结构体里的变量
void print(struct Per* X) //定义一个程序名叫print，程序用到的变量为前面创造的“名叫Per的结构体” 类型的“自定义指针变量”
{
	//方式1
	printf("%s %d %s %s\n", (*X).name, (*X).age, (*X).sex, (*X).tele);
	//调用该程序打印出结构体中的成员，需要用符号*转换自定义指针变量（即变量地址值）为变量值，
	// 即“名叫Per的结构体”类型的“自定义变量”，然后利用 【结构体对象.结构体的成员名】的用法输出结构体的每个对象

	//方式2
	printf("%s %d %s %s\n", X->name, X->age, X->sex, X->tele);
	//另外一种该方法是利用符号“->” 来将 “名叫Per的结构体” 类型的“自定义指针变量”X指向的所关联的结构体对象的成员名上 
	//符号“->”用法【结构体类型指针变量->结构体的成员名】 
}

int main()
{
	//21.define 定义常量
	printf("%d\n",num);
	int a0 = 20;
	int b0 = 24;
	int c0 = add(a0, b0);
	printf("%d\n", c0);
	//-------------------

	//23.1 内存
	int a = 10;// 本句的意思就是向内存申请4个字节存储10这个值
	printf("%p\n", &a); //%p是以地址的格式打印 //&a是利用取地址操作符 取a的地址
	//23.2 指针变量
	int* p = &a;// 是把a的地址赋给p，p即为指针变量，利用int* 来赋值，*说明 p是指针变量 int说明 指针变量指向的值的类型是 整形

	printf("%p\n",(void*)*p); //a值的地址格式，用（void*）强制转换为地址格式
	printf("%d\n", *p); //a值本身
	printf("%p\n", p); //a的地址（指针变量）的值（地址格式）
	// 内存单元的 编号-> 地址 -> 指针 ，存放地址的变量就是 指针变量
	*p = 20;//解引用操作符，意思是通过p中存放的地址，找到p所指向的对象。
	printf("%d\n", a); //这次打印，就是20 说明利用解引用操作符，找到a的地址吧a的值改为20
	//23.3 指针变量的大小
	printf("%zu\n", sizeof(char*));
	printf("%zu\n", sizeof(short*));
	printf("%zu\n", sizeof(int*));
	printf("%zu\n", sizeof(float*));
	printf("%zu\n", sizeof(double*));
	//一个指针变量的大小取决于一个地址存放的时候需要多大空间，
	// 32位的机器上的地址：32bit位-4byte，所以指针变量大小是4个字节
	// 64位的机器上的地址：64bit位-8byte，所以指针变量大小是8个字节
	//-------------------------

	//24.结构体
	
	struct Per p1 = {"zhangsan",20,"nan","12344445555"};
	printf("%s %d %s %s\n", p1.name, p1.age,  p1.tele,p1.sex);//访问结构体里的成员使用符号“.” 用法 ：结构体对象.成员名

	//23+24,利用指针打印结构体里的变量
	print(&p1);//这里之所以是用&p1 因为 p1是在程序中定义的一个实际的“Per 结构体” 类型的“名为p1的结构体变量”
	//而 print这个自定义程序调用的变量的指针变量因此是和变量p1对应的  指针变量-->p1的地址-->&p1

	return 0;

}


//21.define 定义常量-可以用来定义标识符常量|可以定义宏
//23.指针
	//	23.1 内存：计算机中的程序运行都是在内存中的，
	//			   内存是被划分为一个一个的内存单元（一个内存单元大小是一个字节1byte）每个内存单元都有对应的地址（编号）
	//	23.2 指针变量：用来存放地址的变量
	//	23.3 指针变量的大小：
//24.结构体:把一些单一类型组合在一起的一种方式